﻿//131. 分割回文串
//给你一个字符串 s，请你将 s 分割成一些子串，使每个子串都是回文串。
//返回 s 所有可能的分割方案。



class Solution
{
public:
    vector<vector<string>>  ret;
    vector<vector<int>>  dp;
    vector<string>  ans;
    int n;

    void dfs(string& s, int i)
    {
        if (i == n)
        {
            ret.push_back(ans);
            return;
        }

        for (int j = i; j < n; j++)
        {
            if (dp[i][j])
            {
                ans.push_back(s.substr(i, j - i + 1));
                dfs(s, j + 1);
                ans.pop_back();
            }
        }
    }

    vector<vector<string>> partition(string s)
    {
        n = s.size();
        dp.assign(n, vector<int>(n, 0));

        for (int i = 0; i < n; i++)
            dp[i][i] = 1;

        for (int i = 0; i < n - 1; i++)
        {
            if (s[i] == s[i + 1])
                dp[i][i + 1] = 1;
        }

        for (int i = n - 3; i >= 0; i--)
        {
            for (int j = i + 2; j < n; j++)
            {
                if (s[i] == s[j] && dp[i + 1][j - 1])
                {
                    dp[i][j] = 1;
                }
                else
                {
                    dp[i][j] = 0;
                }
            }
        }

        dfs(s, 0);
        return ret;

    }
};